package Cliente;

import java.awt.Point;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import javax.swing.JLabel;
import javax.swing.JOptionPane;

import jogoKing.leilao.JogadorOferta;
import jogoKing.leilao.RespostasLeilao;

import mensagem.*;
import baralho.Mao;
import baralho.carta.Carta;
import baralho.carta.Naipe;

import Cliente.interface_grafico.CartaPartilhada;
import Cliente.interface_grafico.InterfaceGrafico;
import Cliente.interface_grafico.JogadoresJogoFechado;
import Cliente.interface_grafico.Menu;
import Cliente.interface_grafico.MenuLeilao;
import Cliente.interface_grafico.MesaGrafica;
import Cliente.interface_grafico.MonteCartasUI;
import Cliente.interface_grafico.NovoJogoMenu;
import Cliente.interface_grafico.Orientacao;


public class DecisaoHumano implements Decisao {

	private int id;
	private String nickname;
	private ObjectInputStream input;
	private ObjectOutputStream output;
	private InterfaceGrafico interface_grafico;
	private int id_jogo;
	private Menu menu;
	private MenuLeilao leilao;
	private String[] nomes;
	
	
	public DecisaoHumano(ObjectInputStream input, ObjectOutputStream output){
		this.input = input;
		this.output = output;
		this.interface_grafico = new InterfaceGrafico(new CartaPartilhada());
		this.id = -1;
	}
	
	
	@Override
	public void correLogin() {
		
		while (this.id == -1) {
			LockLogin lock = new LockLogin();
			Login login = new Login(this.output, this.input, lock);
			lock.setLock();
	        this.id = login.getIdJogador();
	        System.out.println("LOGIN: " + this.id);
	        this.nickname = login.getNickname();

        }
		
		this.menu = new Menu(this.output, this.id, this.interface_grafico);
		
		
        
	}

	@Override
	public void erro(String string) {
		JOptionPane.showMessageDialog(new JLabel(), string, "Erro", 0);       

	}


	@Override
	public void actualizaMesa(MObject<JogadorJogou> m_jogadorjogou) {
		JogadorJogou jogada = (JogadorJogou)m_jogadorjogou.getObject();
		interface_grafico.getMesa().jogaCarta(jogada.getCarta(), jogada.getNickname());
		
	}


	@Override
	public void informa(String string) {
		JOptionPane.showMessageDialog(null, string, "King - Leilao", JOptionPane.INFORMATION_MESSAGE);
		
		//JOptionPane.showMessageDialog(new JLabel(), string, "Info", 1);
		
	}


	@Override
	public void iniciaJogo(int id_jogo) {
		this.id_jogo = id_jogo;
		this.interface_grafico.getMesa().novoJogo(nomes);
		
	}


	@Override
	public void jogaCarta() {
		try {
            interface_grafico.getMesa().setPode_jogar(true);
            this.output.writeObject(new MCarta(TipoMensagem.CLIENTE_CARTA,
            interface_grafico.getMesa().getCarta_jogada().getCarta(),this.id_jogo));
		} catch (IOException e) {
            e.printStackTrace();
		}
	}


	@Override
	public void jogosAbertos(MSimples mensagem, ObjectOutputStream output) {
		MObjectArray<Integer[]> jogos_abertos = (MObjectArray<Integer[]>)mensagem;
		
		interface_grafico.jogosAbertos(jogos_abertos, this.output, menu);
	}


	@Override
	public void mostraEstatistica(MSimples mensagem, ObjectOutputStream output) {
		if (mensagem.getTipo().equals(TipoMensagem.SERVIDOR_PERFIL)){
			if (((MVerPerfil) mensagem).getId() == this.id) {
				interface_grafico.meuPerfil((MVerPerfil) mensagem, output);
            } else {
            	interface_grafico.perfil((MVerPerfil) mensagem, output);
            }
			return;
		} else if (mensagem.getTipo().equals(TipoMensagem.SERVIDOR_PESQUISA)){
			interface_grafico.pesquisa((MObjectArray)mensagem, output, id);
			return;
		} else if (mensagem.getTipo().equals(TipoMensagem.SERVIDOR_TOP)) {
			interface_grafico.top((MListaJogadores) mensagem, output);
		} else if (mensagem.getTipo().equals(TipoMensagem.SERVIDOR_ESTATISTICA)) {
			interface_grafico.estatistica((MVerEstatistica) mensagem);
		} else if (mensagem.getTipo().equals(TipoMensagem.SERVIDOR_PROCURA_JOGADOR)) {
			interface_grafico.jogadoresEncontrados((MListaJogadores) mensagem, output);
		}
		
	}


	@Override
	public void mostraVencedor(MVencedorRonda vencedorRonda) {
		interface_grafico.getMesa().mostraVencedor(vencedorRonda.getNomeVencedor());
	       
	}


	@Override
	public void recebeMao(Carta[] mao) {
		
		interface_grafico.getMesa().distribuircartas(new Mao(mao).getCartas(), 0);	//Ordenar as cartas

		//Distribuir carta nulas aos outros jogadores porque o cliente deste jogador nao conhece as cartas dos outros jogadores.
		for(int i=0; i<mao.length; i++){
			mao[i] = null;
		}
		for(int i=1; i<4; i++){
			interface_grafico.getMesa().distribuircartas(mao, i);
		}
	}


	@Override
	public void setJogadorActual(String jogadorActual) {
		interface_grafico.getMesa().setJogadorActual(jogadorActual);
		
	}


	@Override
	public void setMiniJogoActual(TipoMiniJogo tipoMiniJogo) {
		interface_grafico.getMesa().setMiniJogoActual(tipoMiniJogo);
		
	}


	@Override
	public void terminouMiniJogo(MObject<Boolean> retiraMensagem) {
		interface_grafico.getMesa().terminaMinijogo(retiraMensagem.getObject());
		
	}
	
	@Override
	public void actualizaPontos(String[] nomes, int[] pontos, int[] ids){
		interface_grafico.getMesa().actualizaPontos(nomes,pontos);
		}


	@Override
	public void leilao433() {
		int yes_no = 0;
		yes_no = JOptionPane.showConfirmDialog(null, "Deseja jogar 4-3-3-3?", "4-3-3-3", JOptionPane.YES_NO_OPTION);
		if(yes_no == JOptionPane.YES_OPTION){
			try {
				synchronized(output){
				output.writeObject(new MLeilao(id_jogo, RespostasLeilao.ACEITA_4333));
				}
			} catch (IOException e) {}
		}else{
			try {
				synchronized(output){
				output.writeObject(new MLeilao(id_jogo, RespostasLeilao.RECUSA_4333));
				}
			} catch (IOException e) {}
		}
		
	}


	@Override
	public void haLeilao() {
		int yes_no = 0;
		yes_no = JOptionPane.showConfirmDialog(null, "Deseja leiloar o seu direito de escolher o trunfo?", "Leilao", JOptionPane.YES_NO_OPTION);
		if(yes_no == JOptionPane.YES_OPTION){
			try {
				synchronized(output){
				this.output.writeObject(new MLeilao(this.id_jogo, RespostasLeilao.ACEITA_LEILAO));
				}
			} catch (IOException e) {}
		}else{
			try {
				synchronized(output){
				this.output.writeObject(new MLeilao(this.id_jogo, RespostasLeilao.RECUSA_LEILAO));
				}
			} catch (IOException e) {}
		}
	}


	@Override
	public void aceitaOferta(MObject<Integer> mensagem) {
		this.leilao.aceitaOferta(mensagem.getObject());
		
	}


	@Override
	public void aumentaOferta(MOferta mensagem) {
		this.leilao.aumentaOferta(mensagem.getValor(), mensagem.isPode_ser_igual());
	}


	@Override
	public void donoLeilao(String dono) {
		if(dono.equals(this.nickname)){
			this.leilao = new MenuLeilao(this.nomes, this.output, this.id_jogo, true);
		}else{
			this.leilao = new MenuLeilao(this.nomes, this.output, this.id_jogo, false);
		}
		this.leilao.setDono(dono);
		this.leilao.setVisible(true);
		
	}


	@Override
	public void organizaNomes(String[] nomes) {
		//Por os nomes na ordem certa
		int j = 0;
		this.nomes = new String[nomes.length];
		for(int i=0; i<nomes.length; i++){
			if(nomes[i].equals(nickname)){
				j = i;
			}
		}

		for(int i=0; i<this.nomes.length; i++){
			this.nomes[i] = nomes[j];
			j++;
			if(j >= nomes.length) j = 0;
		}
		
		this.interface_grafico.getMesa().setNomes(nomes);
		
		/*MesaGrafica mesa = this.interface_grafico.getMesa();
		
		MonteCartasUI south = new MonteCartasUI(nomes[0], new Point(mesa.getWidth()/2-100, mesa.getHeight()-140) ,Orientacao.HORIZONTAL, mesa);
		MonteCartasUI west = new MonteCartasUI(nomes[1], new Point(40, 100) ,Orientacao.VERTICAL, mesa);
		MonteCartasUI north = new MonteCartasUI(nomes[2], new Point(mesa.getWidth()/2-100, 40) ,Orientacao.HORIZONTAL, mesa);
		MonteCartasUI east = new MonteCartasUI(nomes[3], new Point(mesa.getWidth()-100, 100) ,Orientacao.VERTICAL, mesa);
		mesa.setJogadores(north, south, east, west);*/
	}


	@Override
	public void escolheTrunfo() {
		this.leilao.escolheTrunfo();
		
	}


	@Override
	public void fimLeilao() {
		this.leilao.setVisible(false);
		this.leilao.dispose();
		
	}


	@Override
	public void negativos() {
		int resposta = 0;
		Object[] options = {"negativo",
        "positivo"};
		resposta = JOptionPane.showOptionDialog(null, "Deseja jogar para negativos ou para positivos?", "negativo ou positivo?", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[0]);
		if(resposta == JOptionPane.YES_OPTION){
			try {
				synchronized(output){
				output.writeObject(new MLeilao(id_jogo, RespostasLeilao.NEGATIVO));
				}
			} catch (IOException e) {}
		}else{
			this.leilao.escolheTrunfo();
		}
		
	}


	@Override
	public void ofertaActual(MObject<JogadorOferta> mensagem) {
		this.leilao.setOferta(mensagem.getObject().getNome(), mensagem.getObject().getOferta());
		
		
	}


	@Override
	public void setOfertante(MObject<String> mensagem) {
		this.leilao.setQuemOferece(mensagem.getObject());
		
	}


	@Override
	public int getId() {
		return this.id;
	}


	@Override
	public void terminaJogo() {
		menu.getJMenuBar().getMenu(0).getMenuComponent(0).setEnabled(true);
		this.interface_grafico.getMesa().limpa();
		
	}


	@Override
	public void regressoJogo(String[] estadoMesa, String jogadorActual,
			Carta[] mao, int[][] numeroCartasMaos, TipoMiniJogo tipoMiniJogo) {
		this.informa("Regressou ao jogo " + this.id_jogo);
		this.setMiniJogoActual(tipoMiniJogo);
		this.recebeMao(mao);
		this.setJogadorActual(jogadorActual);
		this.interface_grafico.getMesa().setMesa(estadoMesa);
		if(nickname.equals(jogadorActual)){
			this.jogaCarta();
		}
	}


	@Override
	public void novoJogoFechado(MSimples mensagem) {
		new JogadoresJogoFechado("King - Jogadores online", (MListaJogadores)mensagem, output, interface_grafico);
	}


	@Override
	public void trunfoPositivo(Naipe naipe) {
		// TODO Auto-generated method stub
		
	}

}
